#!/bin/bash

# shellcheck disable=SC1091
. ../../lib/shflags

# 使用更可靠的方式检测操作系统
if [[ "$(uname)" == "Darwin" ]]; then
  PASS=$(uuidgen)
else
  # 尝试多种方式生成随机密码
  if command -v uuidgen >/dev/null 2>&1; then
    PASS=$(uuidgen)
  elif [[ -f /proc/sys/kernel/random/uuid ]]; then
    PASS=$(cat /proc/sys/kernel/random/uuid)
  else
    # 如果以上方法都不可用，使用 openssl 生成随机字符串
    PASS=$(openssl rand -hex 16)
  fi
fi

DEFINE_string "conf" "$HOME/redis/conf" 'Redis 配置文件目录' 'c'
DEFINE_string "password" "$PASS" 'Redis 访问密码' 'p'

FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"

echo "参数-conf: $FLAGS_conf"
echo "Generated Admin Password: $FLAGS_password"
echo "Generated Admin Password: $FLAGS_password" > password.txt


set -e # 遇到错误立即退出

# 定义 Redis 配置路径
REDIS_CONF_DIR="$FLAGS_conf"
REDIS_CONF_FILE="$REDIS_CONF_DIR/redis.conf"
REDIS_ACL_FILE="$REDIS_CONF_DIR/users.acl"

# 创建目录
sudo mkdir -p "$REDIS_CONF_DIR"
sudo chown -R "$(id -u):$(id -g)" "$REDIS_CONF_DIR"

# 生成 redis.conf 配置
cat >"$REDIS_CONF_FILE" <<EOF
# 允许本地和 Docker 访问
bind 0.0.0.0
port 6379
# ACL 配置
aclfile /usr/local/etc/redis/users.acl
EOF


# -CONFIG 防止修改 Redis 配置
# +@all 允许所有命令
# ~* 允许所有键
# &* 允许所有频道
cat >"$REDIS_ACL_FILE" <<EOF
user default off nopass
user admin on >$FLAGS_password ~* &* +@all -CONFIG
EOF

# 确保 ACL 文件权限正确
sudo chmod 644 "$REDIS_ACL_FILE"

# 删除容器
docker rm -f redis 2>/dev/null
docker rm -f redis-exporter 2>/dev/null

# 检查网络是否存在，不存在则创建
if ! docker network inspect redis-monitoring &>/dev/null; then
    echo "创建 redis-monitoring 网络..."
    docker network create redis-monitoring
else
    echo "redis-monitoring 网络已存在"
fi

# 运行 Redis 容器
# redis: 使用官方 Redis 镜像
# redis-server: 在容器内执行的命令
# /usr/local/etc/redis/redis.conf: 指定配置文件路径
docker run --restart=always -d \
  --network redis-monitoring \
  -v "$REDIS_CONF_DIR:/usr/local/etc/redis" \
  -p 6380:6379 \
  --user "$(id -u):$(id -g)" \
  --name redis \
  redis redis-server /usr/local/etc/redis/redis.conf

# 运行 Redis Exporter 容器（# 只有启用ACL时才需要显式指定用户名）
docker run -d --name redis-exporter \
  --network redis-monitoring \
  -e REDIS_ADDR=redis://redis:6379 \
  -e REDIS_USER=admin \
  -e REDIS_PASSWORD="$FLAGS_password" \
  -p 9121:9121 \
  oliver006/redis_exporter:latest
